package org.example.erat.log.service;

import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 日志查看服务
 * 用于查看系统日志文件
 */
@Service
public class LogViewService {
    
    private static final String LOG_DIR = "logs";
    private static final String OPERATION_LOG_PATH = LOG_DIR + File.separator + "operation.log";
    private static final String SYSTEM_LOG_PATH = LOG_DIR + File.separator + "system.log";
    private static final String ERROR_LOG_PATH = LOG_DIR + File.separator + "error.log";
    
    /**
     * 获取操作日志内容
     * @param lines 最大行数，-1表示所有行
     * @return 日志内容
     */
    public List<String> getOperationLog(int lines) {
        return readLogFile(OPERATION_LOG_PATH, lines);
    }
    
    /**
     * 获取系统日志内容
     * @param lines 最大行数，-1表示所有行
     * @return 日志内容
     */
    public List<String> getSystemLog(int lines) {
        return readLogFile(SYSTEM_LOG_PATH, lines);
    }
    
    /**
     * 获取错误日志内容
     * @param lines 最大行数，-1表示所有行
     * @return 日志内容
     */
    public List<String> getErrorLog(int lines) {
        return readLogFile(ERROR_LOG_PATH, lines);
    }
    
    /**
     * 获取所有日志文件列表
     * @return 日志文件列表
     */
    public List<String> getLogFiles() {
        List<String> logFiles = new ArrayList<>();
        File dir = new File(LOG_DIR);
        
        if (dir.exists() && dir.isDirectory()) {
            File[] files = dir.listFiles((d, name) -> name.endsWith(".log"));
            if (files != null) {
                for (File file : files) {
                    logFiles.add(file.getName());
                }
            }
        }
        
        return logFiles;
    }
    
    /**
     * 读取日志文件
     * @param filePath 文件路径
     * @param maxLines 最大行数，-1表示所有行
     * @return 日志内容
     */
    private List<String> readLogFile(String filePath, int maxLines) {
        List<String> lines = new ArrayList<>();
        File file = new File(filePath);
        
        if (!file.exists() || !file.isFile()) {
            return Collections.singletonList("日志文件不存在: " + filePath);
        }
        
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = reader.readLine()) != null) {
                lines.add(line);
                if (maxLines > 0 && lines.size() >= maxLines) {
                    break;
                }
            }
        } catch (IOException e) {
            return Collections.singletonList("读取日志文件失败: " + e.getMessage());
        }
        
        // 如果需要最后N行，则反转并取最后N行
        if (maxLines > 0 && lines.size() > maxLines) {
            return lines.subList(lines.size() - maxLines, lines.size());
        }
        
        return lines;
    }
    
    /**
     * 获取指定日志文件内容
     * @param fileName 文件名
     * @param maxLines 最大行数，-1表示所有行
     * @return 日志内容
     */
    public List<String> getLogFileContent(String fileName, int maxLines) {
        String filePath = LOG_DIR + File.separator + fileName;
        return readLogFile(filePath, maxLines);
    }
    
    /**
     * 获取日志文件大小
     * @param filePath 文件路径
     * @return 文件大小（字节）
     */
    public long getLogFileSize(String filePath) {
        File file = new File(filePath);
        if (file.exists() && file.isFile()) {
            return file.length();
        }
        return 0;
    }
    
    /**
     * 获取操作日志文件大小
     * @return 文件大小（字节）
     */
    public long getOperationLogSize() {
        return getLogFileSize(OPERATION_LOG_PATH);
    }
    
    /**
     * 获取系统日志文件大小
     * @return 文件大小（字节）
     */
    public long getSystemLogSize() {
        return getLogFileSize(SYSTEM_LOG_PATH);
    }
    
    /**
     * 获取错误日志文件大小
     * @return 文件大小（字节）
     */
    public long getErrorLogSize() {
        return getLogFileSize(ERROR_LOG_PATH);
    }
    
    /**
     * 获取日志文件最后修改时间
     * @param filePath 文件路径
     * @return 最后修改时间（毫秒）
     */
    public long getLogFileLastModified(String filePath) {
        File file = new File(filePath);
        if (file.exists() && file.isFile()) {
            return file.lastModified();
        }
        return 0;
    }
}
